package br.com.ebc.icontatos.dao;

import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import javax.persistence.NoResultException;

import br.com.ebc.icontatos.genericdao.GenericDAO;
import br.com.ebc.icontatos.model.Cidade;
import br.com.ebc.icontatos.model.Emissora;
import br.com.ebc.icontatos.model.Estado;
import br.com.ebc.icontatos.model.Interesse;
import br.com.ebc.icontatos.model.LoginUsuario;
import br.com.ebc.icontatos.model.Pais;
import br.com.ebc.icontatos.model.Serie;
import br.com.ebc.icontatos.model.Usuario;
import br.com.ebc.icontatos.repository.UsuarioRepository;

public class UsuarioDAO extends GenericDAO<Usuario, Integer> implements UsuarioRepository{

	@Override
	public Usuario findLoginUsuario(LoginUsuario loginUsuario) {
		return (Usuario) getEntityManager().createQuery("select u from Usuario as u where u.loginUsuario = " + loginUsuario.getIdLoginUsuario()).getSingleResult();
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<Usuario> findUsuarios(String usuario, Emissora emissora, Serie programa, Interesse interesse, Pais pais, Estado estado, Cidade cidade) throws NoResultException, SQLException {
		StringBuilder sql = new StringBuilder("select distinct u from Usuario as u");
		ArrayList<String> filtros = new ArrayList<String>();
		String where = "";
		
		if(emissora != null){
			sql.append(", Emissora as em ");
			filtros.add(" em.idEmissora = " + emissora.getIdEmissora() + " ");
		}
		
		if(programa.getIdSerie() != null){
			sql.append(", Serie as s ");
			filtros.add(" s.idSerie = " + programa.getIdSerie() + " ");
		}	
		
		if(interesse != null){
			sql.append(", Interesse as i ");
			filtros.add(" i.idInteresse = " + interesse.getIdInteresse() + " ");
		}
		
		if(pais != null){
			sql.append(", Pais as p");
			filtros.add(" p.idPais = " + pais.getIdPais() + " ");
		}	
		
		if(estado.getIdEstado() != null){
			sql.append(", Estado as es ");
			filtros.add(" es.idEstado = " + estado.getIdEstado() + " ");
			filtros.add(" p.idPais = es.pais ");
		}
		
		if(cidade.getIdCidade() != null){
			sql.append(", Cidade as c ");
			filtros.add(" c.idCidade = " + cidade.getIdCidade() + " ");
			filtros.add(" c.estado = es.idEstado ");
			filtros.add(" u.endereco.cidade.id = c.idCidade");
		}
		
		filtros.add(" u.loginUsuario is not null ");
		
        if(!usuario.equals("")){
        	int index = usuario.indexOf("@");
        	if(index > 0){
        		filtros.add(" u.loginUsuario.email like '%" + usuario + "%' ");
        	} else {
        		filtros.add(" u.nome like '%" + usuario + "&' ");
        	}
        }
        
        for (String e : filtros) {
            where += e + " and ";
        }
        
        where = where.equals("") ? "" : (" where " + where.substring(0, where.length() - 4));

        sql.append(where);
        
		return getEntityManager().createQuery(sql.toString()).getResultList();
	}

}
